package com.example.kotlindemo.conditioncontrol

import com.example.kotlindemo.bean.UserBean
import com.example.kotlindemo.constructorstudy.User

class ControlSimple {

    val a = 10
    val b =20
    //Kt中的if语句不仅可以像Java一样写，还可以作为一个表达式赋值给变量
    // 分支是一个变量
    val max1 = if (a > b) a else b
    //其实分支可以是一个代码块，代码块的最后一行会作为结果返回
    val max2 = if (a > b) {
        println("max:a")
        a // 👈 返回 a
    } else {
        println("max:b")
        b // 👈 返回 b
    }

//2. when
    //在Java中，用swich语句来判断一个变量与一系列值中每个值是否相等
    //相比较Java，省略了break，Kt中自动添加
    //Java中默认是用default关键字，Kotlin中使用else
    fun whenTest(x :Int){
        when(x){
            1->{
                println("我是when 条件 1 ，执行")
            }
            2,3->{//条件 2 或者 3 都执行
                println("我是when 条件 2或者3 ，执行")
            }

            in listOf(1,2) -> print("x 在集合中") //前面有1了，break，执行不到了
            //使用表达式作为分支判断条件
            in 1..10 -> println("x 在区间1到10 之间")//前面有1了，break，执行不到了

            else ->{
                println("when 没有符合条件 default")
            }
        }

    //2.2 和if一样，when也可以作为表达式返回
    val value: Int = when (x) {
        1 -> { x + 1 }
        2 -> { x * 2 }
        else -> { x + 5 }
    }

}
//3. for
   //表示单个元素的item，不用显示的声明
   //使用in关键字，表示item是array里面的一个元素
    //in 后面的变量，可以是任何实现  Iterable接口的对象
    fun forTest(){
        val array = intArrayOf(1,2,3,4)
        for (item in array){
            println(item)
        }

       //a 为10 ，都是闭区间
        for (i in 0..a){
            println("遍历 int i = 0; i <= 10; i++ ，从0到10")
        }

    }


//4.  操作符  ?. 和 ?: 的区别
    //4.1 ?. ，在对象非空时回执行后面的调用，对象为空就返回null
    val str: String? = "Hello"
//    var length: Int = str?.length //报错，如果str为空，就没法给length赋值
    //4.2  使用 ?: 兜底
    val length:Int = str?.length ?: -1 //如果str?.length 返回了null，那么就返回 -1


    fun validate(user: UserBean) {
        val id = user.id ?: return // 👈 验证 user.id 是否为空，为空时 return
    }
// 等同于
    fun validate2(user: UserBean) {
        if (user.id == null) {
            return
        }
        val id = user.id
    }
    //4.3 !!操作符；如果不为空就调用后面的，为空直接抛异常
    val l = str!!.length//如果b不为空，则返回b.length，如果b为空，则抛出异常NullPointerException


// 5. ==和===
    // == ：用于比较基本数据类型及String等类型的内容是否相等（相当于equals）
    //=== ：对引用的内存地址进行比较，相当于Java中的 ==
    fun compareTest(){
    val str1 = "123"
    val str2 = "123"
    println(str1 == str2) // 👈 内容相等，输出：true

    val str3= "字符串"
    val str4 = str3
    val str5 = str3
    print(str4 === str5) // 👈 引用地址相等，输出：true
//6. 其它操作符
    //6.1  区间表示用 ..
    //6.1  :: 得到类的Class对象


}












}